<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 传址问题解决方案一：
        // var a = 10;
        // var b = a;
        // var arr = [1,2,3];
        // var arr2 = arr;
        // arr[1] = 5;
//版本一：可以解决一层传址问题
        // function  getObj(obj) {
        //     // 实现这里的逻辑
        //     var newObj = {};
        //     for(var key in obj){
        //         newObj[key] = obj[key];
        //     }
        //     // console.log(newObj);
        //     return newObj
        // }

        // 版本二：递归生成新的对象 :可以解决多层对象的引用问题(传址问题);
        // function  getObj(obj) {
        //     // 实现这里的逻辑
        //     var newObj = {};
        //     for(var key in obj){
        //         if(typeof obj[key] === "object"){
        //             //  console.log( getObj(obj[key]));
        //              newObj[key] = getObj(obj[key]);
        //         }else{
        //             newObj[key] = obj[key];
        //         }
        //     }
        //     // console.log(newObj);
        //     return newObj
        // }


        // 版本三 ：如何解决 对象和数组的引用（传址问题）;上面只是对象的传址问题解决
        // 深拷贝
        function  getObj(obj) {
            // 实现这里的逻辑
            // var newObj = {};
            var newObj = Array.isArray(obj)?[]:{};
            for(var key in obj){
                if(typeof obj[key] === "object"){
                    //  console.log( getObj(obj[key]));
                     newObj[key] = getObj(obj[key]);
                }else{
                    newObj[key] = obj[key];
                }
            }
            // console.log(newObj);
            return newObj
        }

        // 数组
        var arr = [1,2,3];
        // var arr1 =getObj( arr);   // 深拷贝（deepClone） ：引用问题传址问题
        var arr1 = arr;  //浅拷贝
        console.log(arr1);
        arr1[1] = 5;
        console.log(arr);

        // var obj = {
        //     name1:"张三",
        //     obj2:{
        //         name2:"obj2名字"
        //     }
        // }
        // var obj1 = getObj(obj);
        // console.log("obj1：",obj1);
        // // obj1.name1 = "修改";
        // obj1.obj2.name2 = "修改了";
        // console.log("obj:",obj);

        // 需要判断 对象和数组，如果是对象那么就新生成一个 对象 往新对象添加元素；
        // 如果是数组需要新生成数组，然后在往数组里添加元素；
    //     var arr = [1,2];
    //     var obj = {};
    //     // Array.isArray 判断是否是一个数组；
    //    console.log( Array.isArray(obj));

    // 传址 问题解决二：
    var obj = {
        name:"张三",
        age:undefined
    }
    // JSON.stringify序列化（会把对象转成json串（字符串））  JSON.parse：反序列化（json字符串转成对象）；：丢失部分属性
    var obj1 = JSON.parse( JSON.stringify( obj));
    console.log(obj1);
    obj1.name  = "李四";
    console.log(obj);
    </script>
</body>
</html>